/**
 * Classe Controleur qui fait l'interface entre l'utilisateur et le mod�le
 * (classe Monde du fichier 'Monde.js')
 *
 * @param {Boolean}
 *            Indique l'etat de commencement du jeu
 */
function Controleur(){
    // la valeur de attente sera surement a redefinir
    this.ATTENTE = 20;
    
    this.monde = new Monde(38, 5, 1015);
    
    /**
     * Lien vue-controlleur
     */
    this.vue = new Vue();
    
    this.demarrer = 1;
    
    this.canvas = document.getElementById('canvas');
    this.contexte = this.canvas.getContext('2d');
    this.type = '';
    this.nom = '';
    this.cel_selectionnee;
    this.nb_cellule;
    
    /**
     * Fonction qui permet de creer un nouveau monde
     */
    this.nouveauMonde = function(){
        this.stop();
        this.monde = new Monde(20, 5, 1300);
        this.vue.paint(this.monde, this.canvas);
    };
    
    /*
     * Pour que la fonction pause() fonctionne correctement, il faudra
     * implementer le morceau de code suivant dans la page index <div
     * id="b_pause" id="pause" value="pause" onclick=pause();"
     * style="position:absolute;margin-top:95px;margin-left:95px;"/>
     */
    /**
     * Fonction qui permet de supprimer une cellule du tableau de cellules
     */
    this.supCellule = function supprimeCellule(cellule){
        var cx = cellule.x;
        var cy = cellule.y;
        this.monde.supprimer(cx, cy);
        this.vue.supprimer(cx, cy);
    }
    
    /**
     * Fonction qui permet d'afficher un carre lors d'un clique droit de la
     * souris
     *
     * ATTENTION Penser a mettre <body
     * onclick="controleur.onclick_page(event);">
     */
    this.onclick_page = function(event){
        // test qui sert a rendre ie compatible!
        // if (window.event) event = window.event;
        var x = event.clientX;
        var y = event.clientY + document.body.scrollTop;
        x -= this.canvas.offsetLeft;
        y -= this.canvas.offsetTop;
        if (this.cel_selectionnee == true &&
        x >= 0 &&
        y >= 0 &&
        x <= this.vue.LARGEUR_ZONE_DESSIN &&
        y <= this.vue.HAUTEUR_ZONE_DESSIN) {
            var nb_insere = 0;
            this.monde.ajouter(this.nom, x, y);
            nb_insere++;
            var compte = 0;
            var nouvx;
            var nouvy;
            var aleax;
            var aleay;
            var chgmtx;
            var chgmty;
            if (this.nb_cellule <= 40) {
                chgmtx = this.nb_cellule * 2.3;
                chgmty = this.nb_cellule * 2.3;
            }
            else 
                if (this.nb_cellule <= 230) {
                    chgmtx = this.nb_cellule * 3.6;
                    chgmty = this.nb_cellule * 3.6;
                }
                else {
                    chgmtx = 800;
                    chgmty = 600;
                }
            while (nb_insere < this.nb_cellule) {
                nouvx = x;
                nouvy = y;
                aleax = Math.round(Math.random() * chgmtx);
                aleay = Math.round(Math.random() * chgmty);
                switch (compte % 4) {
                    case 0:
                        nouvx += aleax;
                        nouvy += aleay;
                        if (nouvx > 0 && nouvx < this.vue.LARGEUR_ZONE_DESSIN && nouvy > 0 && nouvy < this.vue.HAUTEUR_ZONE_DESSIN) {
                            this.monde.ajouter(this.nom, nouvx, nouvy);
                            nb_insere++;
                        }
                        compte++;
                        break;
                    case 1:
                        nouvx += aleax;
                        nouvy -= aleay;
                        if (nouvx > 0 && nouvx < this.vue.LARGEUR_ZONE_DESSIN && nouvy > 0 && nouvy < this.vue.HAUTEUR_ZONE_DESSIN) {
                            this.monde.ajouter(this.nom, nouvx, nouvy);
                            nb_insere++;
                        }
                        compte++;
                        break;
                    case 2:
                        nouvx -= aleax;
                        nouvy += aleay;
                        if (nouvx > 0 && nouvx < this.vue.LARGEUR_ZONE_DESSIN && nouvy > 0 && nouvy < this.vue.HAUTEUR_ZONE_DESSIN) {
                            this.monde.ajouter(this.nom, nouvx, nouvy);
                            nb_insere++;
                        }
                        compte++;
                        break;
                    case 3:
                        nouvx -= aleax;
                        nouvy -= aleay;
                        if (nouvx > 0 && nouvx < this.vue.LARGEUR_ZONE_DESSIN && nouvy > 0 && nouvy < this.vue.HAUTEUR_ZONE_DESSIN) {
                            this.monde.ajouter(this.nom, nouvx, nouvy);
                            nb_insere++;
                        }
                        compte++;
                        break;
                    default:
                        alert("Probl�me de valeur pour compte");
                        break;
                }
            }
            this.vue.paint(this.monde, this.canvas);
        }
    }
    
    this.type_entite = function(id){
        this.stop();
        this.cel_selectionnee = true;
        this.nom = id;
        this.nb_cellule = document.getElementById("nbEntite").value;
        if (this.nb_cellule <= 0) 
            this.nb_cellule = 1;
    }
    
    /**
     * Methode appellee par le fichier html afin de passer au tour suivant et
     * d'afficher le contenu du monde ? PAS SUR DU TOUT
     */
    this.tourSuivant = function(){
        document.getElementById("nbTours").value = parseInt(document.getElementById("nbTours").value) + 1;
    }
    
    this.afficher = function(id){
        if (document.getElementById(id).style.display == 'block') 
            document.getElementById(id).style.display = 'none';
        else 
            document.getElementById(id).style.display = 'block';
    }
    
    var that = this;
    var timer;
    
    this.avancerUnPas = function(){
        that.cel_selectionnee = false;
        that.tourSuivant();
        that.monde.evolution();
        document.getElementById("nbEntite").value = 1;
        that.vue.paint(that.monde, that.canvas);
    }
    
    this.avancerAll = function(){
        this.cel_selectionnee = false;
        document.getElementById("nbEntite").value = 1;
        if (this.demarrer == 1) {
            timer = window.setInterval(this.avancerUnPas, this.ATTENTE);
            this.demarrer = 0;
        }
        
    }
    /**
     * fonction pour le slider de la temporisation
     */
    this.showValue = function(value_new){
        this.demarrer = 1;
        document.getElementById("vitesse").innerHTML = value_new;
        var tempo = document.getElementById("vitesse").innerHTML;
        clearInterval(timer);
        if (tempo == 0) 
            that.stop();
        else {
            that.ATTENTE = 100 / tempo;
            that.avancerAll();
        }
    }
    
    /**
     * fonction pour le slider de la temperature
     */
    this.showValue2 = function(value_new){
        document.getElementById("temperature").innerHTML = value_new;
        this.monde.ajusteTemperature(parseInt(value_new));
    }
    
    /**
     * fonction pour le slider de la pression
     */
    this.showValue3 = function(value_new){
        document.getElementById("pression").innerHTML = value_new;
        this.monde.ajustePression(value_new);
    }
    
    /**
     * fonction pour le slider de la nourriture
     */
    this.showValue4 = function(value_new){
        document.getElementById("nourriture").innerHTML = value_new;
        // this.monde.pression = value_new;
    }
    
    /**
     * fonction pour mettre en pause le jeu
     */
    this.stop = function(){
        this.cel_selectionnee = false;
        this.demarrer = 1;
        clearInterval(timer);
    }
    /**
     * Fonction de gestion du clavier
     * @param {Object} evenement
     */
    this.touche = function(evenement){
        var touche = window.event ? evenement.keyCode : evenement.which;
        switch (touche) {
            case 100: //Touche d
                if (this.demarrer == 1) {
                    this.avancerAll();
                }
                else {
                    this.stop();
                }
                break;
			case 112: //Touche p
					this.stop();
				break;
            case 97: // Touche a
                this.avancerUnPas();
                break;
			case 110: // Touche n
				this.nouveauMonde();
				break;
			case 17: //Touche CTRL+q
				window.close();
				break;
            default:
                break;
        }
    }
}
